﻿using System;
using System.Xml;
using Framework.CapaDeDatos.AccesoADatos;
using Framework.CapaDeDatos.Excepciones;
using Newtonsoft.Json;

namespace Framework.CapaDeDatos.Proveedores.Persistencia.Serializados
{
    public class Serializado : ISerializado
    {
        #region Private Fields
        private IAccesoADatos accesoADatos;
        #endregion
       
        #region Public Constructors

        public Serializado(IAccesoADatos accesoADatos)
        {
            if (accesoADatos != null)
                this.accesoADatos = accesoADatos;
            else
                throw new ExceptionParametroNulo();
        }

        #endregion

        #region ISerializados Members

        public XmlDocument Recuperar(String query, String claseObjeto)
        {
            String stream = this.accesoADatos.Recuperar(query);
            XmlDocument resultado = ObtenerXml(stream, claseObjeto);
            return resultado;
        }

        public XmlDocument Guardar(String query, String postData, String claseObjeto)
        {
            String stream = this.accesoADatos.Guardar(query, postData);
            XmlDocument resultado = ObtenerXml(stream, claseObjeto);
            return resultado;
        }

        #endregion

        private static XmlDocument ObtenerXml(String stream, String claseObjeto)
        {
            XmlDocument resultado = null;
            try
            {
                resultado = new XmlDocument();
                resultado.Load(stream);
            }
            catch
            {
                try
                {
                    resultado = JsonConvert.DeserializeXmlNode("{\"" + claseObjeto + "\":[" + stream + "]}");
                }
                catch { }
            }
            return resultado;
        }
    }
}
